<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>12.2.JS简单类型与复杂类型-数据类型传参</title>
    <script>
        // 1.简单数据类型传参
        function fn(a) {
            a++;
            console.log(a);  // 11
        }
        var x = 10;
        fn(x);
        console.log(x); // 10
        // （1）x在 栈 内开辟空间存放10
        // （2）调用到函数后 a单独也在 栈 内开辟一个10的空间
        // （3）a 在自己开辟 栈内 做a++运算 输出得到了a=11
        // （4）x不受影响 还是 x=10
        console.log('--------------------------------------');
        // 2.复制数据类型传参
        function Person(name) {
            this.name = name;
        }
        function f1(x) {  // x=p
            console.log(x.name); // 2.输出的是：X
            x.name = 'Y';
            console.log(x.name); // 3.输出的是：Y
        }
        var p = new Person('X');
        console.log(p.name);     // 1.输出的是：X
        f1(p);
        console.log(p.name);     // 4.输出的是：Y
        // （1）函数在 堆 里开辟了一个 preson name
        // （2）p在 栈 内开辟了 一个十六进制地址 并指向 堆内的 preson name=X
        // （3）第一个输出的是X
        // （4）调用到函数内 x=p 所以x在 栈 内开辟一个和p同样十六进制地址 同时也指向了堆内的 preson name=X 
        // （5）所以第二个输出是X
        // （6）函数在 堆 内发生改变 preson name=Y了 输出第三个变了了Y
        // （7）最终 p 指向的 栈 内的地址 同时依然指向了 堆 内发生改变 preson name=Y 第四个输出为Y
    </script>
</head>

<body>

</body>

</html>